/* post用的自定义类,有2个:
SimplePoster用于一般的post,ThreadObserver用于线程监视
*/

/* 自定义的一般post类: SimplePoster
指定appname, methodName,对应的就是flask应用的应用名称,方法名称,
callBackFunction(respData)是对应post的返回{}的回调函数.

post(data)是向上post一个data的方法.
*/
class SimplePoster{
  
  constructor(appname, methodName, callBackFunction) {
    
    this._url = 'http://127.0.0.1:5001/method/'+appname+'/'+methodName;
    this._callBackFunction = callBackFunction;
    
  }
  
  post(data){
    $.ajax({
      type: 'POST',
      url: this._url,
      data: data,
      success: (respData, textStatus, jqXHR) => {
        this._callBackFunction(respData);
      },
      dataType: 'json'
    });
  }
  
}

/* 自定义的线程观察类: ThreadObserver

作用是设定为on的时候,固定间隔的post服务器,访问某个app的某个线程情况.
当访问到的status['code'] != -1时,也就是说线程并非运行中,不再访问.
或者发现返回不对劲时,不再访问

公有方法:
构造方法(appname, threadName, millisecond,callBackFunction):
  appname, threadName,指定访问的app与线程名,
  millisecond是指定的计时间隔,若小于等于100则自动定为1000,
  callBackFunction(status)是得到服务器返回时执行的内容,
  stopFunction(status)则是停止监视时执行的内容

start():开始连续访问
stop():停止连续访问
_per():固定间隔的行动
 */
 
class ThreadObserver{
  
  constructor(appname, threadName, millisecond, callBackFunction
    ,stopFunction) {
    
    this._url = 'http://127.0.0.1:5001/thread/'+appname+'/'+threadName;
    this._millisecond = millisecond;
    if (this._millisecond < 100){
      this._millisecond = 1000;
    }
    this._callBackFunction = callBackFunction;
    this._stopFunction = stopFunction;
    
    this._on = false;
    this._interval = null;
    
  }
  
  start(){
    if (this._on){
      return
    }
    this._on = true;
    this._interval = setInterval(() => {this._per();}, this._millisecond);
  }
  
  stop(){
    this._on = false;
    clearInterval(this._interval);
    this._interval = null;
  }
  
  // on时每个时间间隔执行的方法
  _per(){
    if (!(this._on)){
      clearInterval(this._interval);
      this._interval = null;
    }
    
    $.ajax({
      type: 'POST',
      url: this._url,
      data: {},
      success: (status, textStatus, jqXHR) => {
        try{
          this._callBackFunction(status);
          if (status['code'] != -1){
            this._stopFunction(status);
            this.stop();
          };
        }catch(err){
          console.log('线程监视post='+this._url+'出现错误:', err)
          this.stop();
        }
      },
      dataType: 'json'
    });
  }
  
}